package cc.loac.heba.service;

import cc.loac.heba.dao.MessageDao;
import cc.loac.heba.pojo.Message;
import cc.loac.heba.pojo.Result;
import cc.loac.heba.tool.Common;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class MessageService {

    @Resource
    MessageDao messageDao;

    @Resource
    LoginTokenService loginTokenService;

    /**
     * 根据邮箱获取用户的消息
     * @param email 邮箱
     * @param token Token
     * @return Result
     */
    public String getMessage(String email, String token) {
        Result result;
        try {
            result = tokenIsExpired(email, token);
            if (result.getStatus() != 0) {
                // Token 有问题，返回原因
                return Common.toJson(result);
            }

            List<Message> messages = messageDao.selectMessageByEmail(email);
            if (messages == null || messages.size() == 0) {
                result.setContent(new ArrayList<>());
                return Common.toJson(result);
            }

            result.setContent(messages);
            return Common.toJson(result);
        } catch (Exception e) {
            e.printStackTrace();
            return Common.exceptionResults();
        }
    }

    /**
     * 检查 Token 是否不存在或者过期
     * @param email 邮箱
     * @param token Token
     * @return Result
     */
    private Result tokenIsExpired(String email, String token) {
        // 未传入 token
        if (token == null) {
            return Common.tokenIsNull();
        }
        Result tokenResult = loginTokenService.checkToken(email, token);
        if (tokenResult.getStatus() != 0) {
            // Token 已经过期
            return tokenResult;
        }
        return new Result();
    }

    /**
     * 添加消息
     * @param email 发送者邮箱
     * @param sendToEmail 接收者邮箱
     * @param type 消息类型
     * @param heiId 嘿文 ID，可能为空
     */
    public void addMessage(String email, String sendToEmail, String type, String heiId) {
        try {
            // 如果消息类型是点赞或关注，就先尝试删除已有的信息，防止多次点赞嘿文产生多个消息
            if (type.equals(Message.TYPE_LIKE) || type.equals(Message.TYPE_FOLLOW)) {
                removeMessageByEmailAndSendToEmailAndType(email, sendToEmail, type);
            }

            // 判断类型是否为评论或点赞或回复评论
            boolean typeIsCommentOrLikeOrReply = type.equals(Message.TYPE_COMMENT) || type.equals(Message.TYPE_LIKE) || type.equals(Message.TYPE_REPLY);

            Message message = new Message();
            message.setEmail(sendToEmail);
            message.setSendFromEmail(email);
            message.setCreateTime(new Date());
            message.setIsRead(Message.READ_FALSE);
            if (typeIsCommentOrLikeOrReply) {
                // 只有消息类型为评论或点赞或回复时才设置嘿文 ID
                message.setHeiId(Integer.parseInt(heiId));
            }
            message.setType(type);
            messageDao.insertMessage(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据邮箱和接收者邮箱和消息类型来删除消息
     * @param email 发送者邮箱
     * @param sendToEmail 接收者邮箱
     * @param type 消息类型
     */
    private void removeMessageByEmailAndSendToEmailAndType(String email, String sendToEmail, String type) {
        try {
            messageDao.deleteMessageByEmailAndSendToEmailAndType(email, sendToEmail, type);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除消息
     * @param email 消息接收者邮箱
     * @param token Token
     * @return Result
     */
    public String removeMessage(String email, String token) {
        Result result;
        try {
            result = tokenIsExpired(email, token);
            if (result.getStatus() != 0) {
                // Token 有问题，返回原因
                return Common.toJson(result);
            }

            messageDao.deleteMessage(email);
            return Common.toJson(result);
        } catch (Exception e) {
            e.printStackTrace();
            return Common.exceptionResults();
        }
    }

    /**
     * 将消息设为已读
     * @param email 邮箱
     * @param messageIds 消息 ID
     * @param token Token
     * @return Result
     */
    public String updateMessageRead(String email, List<String> messageIds, String token) {
        Result result;
        try {
            result = tokenIsExpired(email, token);
            if (result.getStatus() != 0) {
                // Token 有问题，返回原因
                return Common.toJson(result);
            }

            // 消息不能为空
            if (messageIds.size() == 0) {
                result.setStatus(-2);
                result.setContent("消息 ID 数组不能为空");
                return Common.toJson(result);
            }

            messageDao.updateMessageRead(messageIds, Message.READ_TRUE, email);
            return Common.toJson(result);
        } catch (Exception e) {
            e.printStackTrace();
            return Common.exceptionResults();
        }
    }

    /**
     * 将所有消息设为已读
     * @param email 邮箱
     * @param token Token
     * @return Result
     */
    public String updateAllMessageRead(String email, String token) {
        Result result;
        try {
            result = tokenIsExpired(email, token);
            if (result.getStatus() != 0) {
                // Token 有问题，返回原因
                return Common.toJson(result);
            }

            messageDao.updateAllMessageRead(email, Message.READ_TRUE);
            return Common.toJson(result);

        } catch (Exception e) {
            e.printStackTrace();
            return Common.exceptionResults();
        }
    }
}
